﻿#ifndef INSTRUMENTBASE_H
#define INSTRUMENTBASE_H


#include <QStringList>

class CommandItem;
/**
 * @brief The InstrumentBase class 载荷基类，各卫星载荷基于此基类派生
 */
class InstrumentBase
{
public:
    enum MirrorType{
        Mirror_EW,
        Mirror_NS
    };
    InstrumentBase();

    /**
     * @brief taskTypes 载荷任务类型，如全员盘观测、恒星观测等
     * @return
     */
    virtual QStringList taskTypes() = 0;

    /**
     * @brief instrumentName 载荷名称代号，用于识别
     * @return
     */
    virtual QString instrumentName() = 0;

    // 计算指令时间，指令可能是快速指向，也可能是其他,需要补充指令的相关信息
    /**
     * @brief calCommandTime 计算指令时间，需要在子类中实现
     * @param pCommand 需要计算的指令指针
     * @return 错误代码，指令时间计算有问题需要返回错误代码
     */
    virtual int calCommandTime(CommandItem* pCommand) = 0;

    /**
     * @brief calCurrentPos 计算指令在任意时刻光标应该在的位置
     * @param pCommand 指令指针
     * @param dTime 相对时间，以指令开始时间为基准加上该时间
     * @param dPosEW dTime时刻，光标应该在的东西镜位置
     * @param dPosNS dTime时刻，光标应该在的南北镜位置
     * @return 错误代码，各类错误的代码
     */
    virtual int calCurrentPos(CommandItem* pCommand,double dTime,double& dPosEW,double& dPosNS) = 0;
    virtual void getActuallocation(double x,double dx,double rlx[] ,double v)= 0;

    /**
     * @brief getScanTime
     * @param x
     * @param dx
     * @return
     */
    virtual double getScanTime(double x,double dx,double v)= 0;

    /**
     * @brief getQuickTime 获取快速指向时间
     * @param x 开始东西镜位置（度）
     * @param y 开始南北镜位置（度）
     * @param dx 结束点东西镜位置（度）
     * @param dy 结束点南北镜位置（度）
     * @return 指向过程所需时间（秒）
     */
    virtual double getQuickTime(double x, double y, double dx, double dy,double v=10)= 0;

    //计算恒星滑过镜子需要的时间
    //virtual double glideStarTime()=0;
public:
    double mdMirrorHeight;
    double mdMirrorLeftHalf;// 扫描镜中轴线到右侧角距，单位度，机械角
    double mdMirrorRightHalf;// 扫描镜中轴线到左侧角距，单位度，机械角
    double mdMirrorScanSpeed;//扫描镜运动速度
    double mdFastPointSpeed;//快速指向速度

    double mdScanFastPointSpeed;// 红外背景观测时快速指向速度，红外背景观测的快速指向采用扫描模式

    double mdFulldisEWMin;//全圆盘东西小值
    double mdFulldisEWMax;//东西大值
    double mdFulldisNSMin;
    double mdFulldisNSMax;
    double mdChinaNormalNSMin;//中国区南北小值
    double mdChinaNormalNSMax;//南北大值
    double mdChinaNormalEWMin;
    double mdChinaNormalEWMax;
    int ifcompensate;//是否加速补偿算法
};

#endif // INSTRUMENTBASE_H
